home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / maildirwatch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  3.2 KB  |  126 lines

  1. #include "getln.h"
  2. #include "substdio.h"
  3. #include "subfd.h"
  4. #include "prioq.h"
  5. #include "stralloc.h"
  6. #include "str.h"
  7. #include "exit.h"
  8. #include "hfield.h"
  9. #include "readwrite.h"
  10. #include "open.h"
  11. #include "headerbody.h"
  12. #include "maildir.h"
  13.  
  14. #define FATAL "maildirwatch: fatal: "
  15.  
  16. void die_nomem() { strerr_die2x(111,FATAL,"out of memory"); }
  17.  
  18. stralloc recipient = {0};
  19. stralloc sender = {0};
  20. stralloc fromline = {0};
  21. stralloc text = {0};
  22.  
  23. void addtext(s,n) char *s; int n;
  24. {
  25.  if (!stralloc_catb(&text,s,n)) die_nomem();
  26.  if (text.len > 158) text.len = 158;
  27. }
  28. void dobody(h) stralloc *h; { addtext(h->s,h->len); }
  29. void doheader(h) stralloc *h;
  30. {
  31.  int i;
  32.  switch(hfield_known(h->s,h->len))
  33.   {
  34.    case H_SUBJECT:
  35.      i = hfield_skipname(h->s,h->len);
  36.      addtext(h->s + i,h->len - i);
  37.      break;
  38.    case H_DELIVEREDTO:
  39.      i = hfield_skipname(h->s,h->len);
  40.      if (i < h->len)
  41.        if (!stralloc_copyb(&recipient,h->s + i,h->len - i - 1)) die_nomem();
  42.      break;
  43.    case H_RETURNPATH:
  44.      i = hfield_skipname(h->s,h->len);
  45.      if (i < h->len)
  46.        if (!stralloc_copyb(&sender,h->s + i,h->len - i - 1)) die_nomem();
  47.      break;
  48.    case H_FROM:
  49.      if (!stralloc_copyb(&fromline,h->s,h->len - 1)) die_nomem();
  50.      break;
  51.   }
  52. }
  53. void finishheader() { ; }
  54.  
  55. stralloc filenames = {0};
  56. prioq pq = {0};
  57.  
  58. char inbuf[SUBSTDIO_INSIZE];
  59. substdio ssin;
  60.  
  61. void main()
  62. {
  63.  struct prioq_elt pe;
  64.  int fd;
  65.  int i;
  66.  
  67.  if (maildir_chdir() == -1)
  68.    strerr_die1(111,FATAL,&maildir_chdir_err);
  69.  
  70.  for (;;)
  71.   {
  72.    maildir_clean(&filenames);
  73.    if (maildir_scan(&pq,&filenames,1,0) == -1)
  74.      strerr_die1(111,FATAL,&maildir_scan_err);
  75.  
  76.    substdio_putsflush(subfdout,"\033[;H\033[;J");
  77.  
  78.    while (prioq_min(&pq,&pe))
  79.     {
  80.      prioq_delmin(&pq);
  81.  
  82.      fd = open_read(filenames.s + pe.id);
  83.      if (fd == -1) continue;
  84.      substdio_fdbuf(&ssin,read,fd,inbuf,sizeof(inbuf));
  85.  
  86.      if (!stralloc_copys(&sender,"?")) die_nomem();
  87.      if (!stralloc_copys(&recipient,"?")) die_nomem();
  88.      if (!stralloc_copys(&fromline,"")) die_nomem();
  89.      if (!stralloc_copys(&text,"")) die_nomem();
  90.      if (headerbody(&ssin,doheader,finishheader,dobody) == -1)
  91.        strerr_die2x(111,FATAL,"trouble reading new message");
  92.  
  93.      for (i = 0;i < fromline.len;++i)
  94.        if ((fromline.s[i] < 32) || (fromline.s[i] > 126))
  95.          fromline.s[i] = '/';
  96.      for (i = 0;i < sender.len;++i)
  97.        if ((sender.s[i] < 32) || (sender.s[i] > 126))
  98.          sender.s[i] = '?';
  99.      for (i = 0;i < recipient.len;++i)
  100.        if ((recipient.s[i] < 32) || (recipient.s[i] > 126))
  101.          recipient.s[i] = '?';
  102.      for (i = 0;i < text.len;++i)
  103.        if ((text.s[i] < 32) || (text.s[i] > 126))
  104.          text.s[i] = '/';
  105.      substdio_puts(subfdout,"FROM ");
  106.      substdio_put(subfdout,sender.s,sender.len);
  107.      substdio_puts(subfdout," TO <");
  108.      substdio_put(subfdout,recipient.s,recipient.len);
  109.      substdio_puts(subfdout,">\n");
  110.      if (fromline.len)
  111.       {
  112.        substdio_puts(subfdout,"\033[1m");
  113.        substdio_put(subfdout,fromline.s,fromline.len);
  114.        substdio_puts(subfdout,"\033[0m\n");
  115.       }
  116.      substdio_put(subfdout,text.s,text.len);
  117.      substdio_puts(subfdout,"\n\n");
  118.  
  119.      close(fd);
  120.     }
  121.  
  122.    substdio_flush(subfdout);
  123.    sleep(30);
  124.   }
  125. }
  126.